package com.dongwu.config.Redis;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.dongwu.common.utils.SerializeUtil;

import redis.clients.jedis.Jedis;

/**
 * redis操作工具类
 * 
 * @author xyj
 *
 */
public class RedisUtil {

	private static Jedis jedis = RedisConfig.RedisCommit();

	// --------------------------------------------------------------------------------------------//
	// TODO----------------------------------Jedis处理entity----------------------------------------//
	// --------------------------------------------------------------------------------------------//
	/**
	 * 插入String类型的数据
	 * 
	 * @param Key
	 * @param value
	 * @return
	 */
	public static boolean SetStr(String Key, String value) {
		String res = jedis.set(Key, value);
		if (res.equals("OK")) {
			return true;
		}
		return false;
	}

	/**
	 * 拼接String类型的数据
	 * 
	 * @param Key
	 * @param appendvalue
	 * @return (返回拼接后的字符串长度)
	 */
	public static Long AppendStr(String Key, String appendvalue) {
		return jedis.append(Key, appendvalue);
	}

	/**
	 * 删除指定的key
	 * 
	 * @param Key
	 * @return (返回删除成功的数量)
	 */
	public static Long DelStr(String Key) {
		return jedis.del(Key);
	}

	/**
	 * 批量插入键值对
	 * 
	 * @param kv
	 *            批量传入k-v键值对 例如：（k1,v1,k2,v2,k3,v3...）
	 * @return
	 */
	public static boolean SetListStr(String... kv) {
		String res = jedis.mset(kv);
		if (res.equals("OK")) {
			return true;
		}
		return false;
	}

	/**
	 * 对key的value+1（仅限数字）
	 * 
	 * @param Key
	 * @return （返回+1以后的value）
	 */
	public static Long AddOneStr(String Key) {
		return jedis.incr(Key);
	}

	// --------------------------------------------------------------------------------------------//
	// TODO----------------------------------Jedis处理entity----------------------------------------//
	// -------------------------------------------------------------------------------------------//
	/**
	 * redis存储entity对象
	 * 
	 * @param key
	 * @param entity
	 * @return
	 */
	public static <T> boolean SetEntity(String key, T entity) {
		String res = jedis.set(key.getBytes(), SerializeUtil.serialize(entity));
		if (res.equals("OK")) {
			return true;
		}
		return false;
	}

	/**
	 * reids获取存储的entity
	 * 
	 * @param key
	 * @param entity
	 * @return
	 */
	public static Object GetEntity(String key) {
		byte[] value = jedis.get(key.getBytes());
		Object obj = SerializeUtil.unserialize(value);
		return obj;
	}

	// --------------------------------------------------------------------------------------------//
	// TODO-----------------------------Jedis处理map<String,String>---------------------------------//
	// --------------------------------------------------------------------------------------------//
	/**
	 * redis 存储Map<String, String>
	 * 
	 * @param map
	 * @return
	 */
	public static boolean SetMap(String key, Map<String, String> map) {
		String res = jedis.hmset(key, map);
		if (res.equals("OK")) {
			return true;
		}
		return false;
	}

	/**
	 * 获取redis中Map<String,String>的值
	 * 
	 * @param key
	 *            （redis中map的key）
	 * @param mapKey
	 *            （map中的key，数量不限，String... 类型）
	 * @return
	 */
	public static List<String> GetMap(String key, String... mapKey) {
		return jedis.hmget(key, mapKey);
	}

	/**
	 * 删除Map<String,String>中的键值对
	 * 
	 * @param key
	 *            （redis中map的key）
	 * @param mapKey
	 *            （map中的key，数量不限，String... 类型）
	 * @return (返回删除成功的数量)
	 */
	public static Long DelMapKV(String key, String... mapKey) {
		return jedis.hdel(key, mapKey);
	}

	/**
	 * 获取redis中Map<String,String>的长度
	 * 
	 * @param key
	 * @return
	 */
	public static Long GetMapSize(String key) {
		return jedis.hlen(key);
	}

	/**
	 * 判断redis中key是否存在
	 * 
	 * @param key
	 * @return
	 */
	public static boolean ExistsMap(String key) {
		return jedis.exists(key);
	}

	/**
	 * 返回map对象中的所有key
	 * 
	 * @param key
	 * @return
	 */
	public static Set<String> GetMapAllKey(String key) {
		return jedis.hkeys(key);
	}

	/**
	 * 获取map中所有的value
	 * 
	 * @param key
	 * @return
	 */
	public static List<String> GetMapAllValue(String key) {
		return jedis.hvals(key);
	}

	// --------------------------------------------------------------------------------------------//
	// TODO---------------------------------Jedis设置过期时间------------------------------------------//
	// --------------------------------------------------------------------------------------------//
	/**
	 * 为指定的key设置超时（秒为单位）和value
	 * 
	 * @param key
	 * @param seconds
	 * @param value
	 * @return
	 */
	public static boolean SetOvertimeInSecondsValue(String key, int seconds, String value) {
		String res = jedis.setex(key, seconds, value);
		if (res.equals("OK")) {
			return true;
		}
		return false;
	}

	/**
	 * 为指定的key设置超时（毫秒为单位）和value
	 * 
	 * @param key
	 * @param milliseconds
	 * @param value
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static boolean SetOvertimeInMillisecondsValue(String key, int milliseconds, String value) {
		String res = jedis.psetex(key, milliseconds, value);
		if (res.equals("OK")) {
			return true;
		}
		return false;
	}

	/**
	 * 为指定的key设置超时时间（秒为单位）
	 * 
	 * @param key
	 * @param seconds
	 * @return
	 */
	public static Long SetOvertimeInSeconds(String key, int seconds) {
		return jedis.expire(key, seconds);
	}

	/**
	 * 为指定的key设置超时时间（毫秒为单位）
	 * 
	 * @param key
	 * @param milliseconds
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static Long SetOvertimeInMilliseconds(String key, int milliseconds) {
		return jedis.pexpire(key, milliseconds);
	}
}
